デスクトップ上のデフォルトのスクロールバー
まとめ
ScrollBehavior
自動的に適用されるようになりましたScrollbar
に
デスクトップ プラットフォーム - Mac、Windows、Linux 上のスクロール ウィジェット。
コンテクスト
この変更の前は、Scrollbar
スクロールウィジェットに適用されました
すべてのプラットフォームで開発者が手動で実行します。これは一致しませんでした
デスクトップ プラットフォームで Flutter アプリケーションを実行する際の開発者の期待。
さて、受け継がれたのは、ScrollBehavior
を適用しますScrollbar
自動的
ほとんどのスクロールウィジェットに。これは次のような方法ですGlowingOverscrollIndicator
によって作成されますScrollBehavior
。この対象から除外されるいくつかのウィジェット
動作を以下に示します。
この機能の管理と制御を改善するには、ScrollBehavior
も更新されました。のbuildViewportChrome
適用されたメソッド
あるGlowingOverscrollIndicator
、非推奨になりました。その代わり、ScrollBehavior
ビューポートを装飾するための個別のメソッドをサポートするようになりました。buildScrollbar
とbuildOverscrollIndicator
。これらのメソッドをオーバーライドして制御できます。
スクロール可能なものを中心に構築されているもの。
さらに、ScrollBehavior
サブクラスMaterialScrollBehavior
とCupertinoScrollBehavior
公開されており、開発者が拡張できるようになりました
他の既存のものの上に構築しますScrollBehavior
フレームワーク内にあります。これらは
サブクラスは以前はプライベートでした。
変更内容の説明
以前のアプローチでは、開発者が独自のアプローチを作成する必要がありました。Scrollbar
オンです
すべてのプラットフォーム。一部の使用例では、ScrollController
提供する必要があるだろう
にScrollbar
そしてスクロール可能なウィジェット。
final ScrollController controller = ScrollController();
Scrollbar(
controller: controller,
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
)
);
のScrollBehavior
今はScrollbar
自動的
デスクトップで実行する場合、ハンドルはScrollController
にScrollbar
あなたのために。
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
フレームワーク内の一部のウィジェットは免除されます。
この自動Scrollbar
応用。
彼らです:
-
EditableText
、 いつmaxLines
は1です。 ListWheelScrollView
PageView
NestedScrollView
これらのウィジェットは継承されたウィジェットを手動でオーバーライドするため、ScrollBehavior
削除するScrollbar
s、これらすべてのウィジェットには、scrollBehavior
パラメータを指定して、オーバーライドの代わりに使用できるようにします。
この変更により、テストの失敗、クラッシュ、エラー メッセージは発生しませんでした。
開発中ですが、結果的に 2 つの結果が生じる可能性があります。Scrollbar
s
手動で追加している場合、アプリケーションでレンダリングされます。dccdb59-cbb1-44a6-b1ad-595c047879das
デスクトッププラットフォーム上で。
アプリケーションでこれが発生した場合は、いくつかの方法があります。 この機能を制御および設定します。
-
手動で適用したものを削除します
Scrollbar
あなたの中にある アプリケーションをデスクトップで実行する場合。 -
拡張する
ScrollBehavior
、MaterialScrollBehavior
、 またCupertinoScrollBehavior
デフォルトの動作を変更します。- あなた自身のもので
ScrollBehavior
、設定することでアプリ全体に適用できますMaterialApp.scrollBehavior
またCupertinoApp.scrollBehavior
。 - または、特定のウィジェットにのみ適用したい場合は、
ScrollConfiguration
問題のウィジェットの上にある カスタムScrollBehavior
。
- あなた自身のもので
スクロール可能なウィジェットはこれを継承し、この動作を反映します。
- 自分で作成するのではなく、
ScrollBehavior
、別の変更オプション デフォルトの動作では、既存のScrollBehavior
を切り替えて、 希望の機能。- を作成します
ScrollConfiguration
ウィジェットツリー内で、そして 既存のコピーを修正して提供するScrollBehavior
の 現在のコンテキストを使用してcopyWith
。
- を作成します
移行ガイド
Scrollbar
デスクトップ上
マニュアルを削除する移行前のコード:
final ScrollController controller = ScrollController();
Scrollbar(
controller: controller,
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
)
);
移行後のコード:
final ScrollController controller = ScrollController();
final Widget child = ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
// Only manually add a `Scrollbar` when not on desktop platforms.
// Or, see other migrations for changing `ScrollBehavior`.
switch (currentPlatform) {
case TargetPlatform.linux:
case TargetPlatform.macOS:
case TargetPlatform.windows:
return child;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.iOS:
return Scrollbar(
controller: controller,
child: child;
);
}
ScrollBehavior
あなたのアプリケーションのために
カスタムの設定移行前のコード:
// MaterialApps previously had a private ScrollBehavior.
MaterialApp(
// ...
);
移行後のコード:
// MaterialApps previously had a private ScrollBehavior.
// This is available to extend now.
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods like buildOverscrollIndicator and buildScrollbar
}
// ScrollBehavior can now be configured for an entire application.
MaterialApp(
scrollBehavior: MyCustomScrollBehavior(),
// ...
);
ScrollBehavior
特定のウィジェットの場合
カスタムの設定移行前のコード:
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
移行後のコード:
// MaterialApps previously had a private ScrollBehavior.
// This is available to extend now.
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods like buildOverscrollIndicator and buildScrollbar
}
// ScrollBehavior can be set for a specific widget.
final ScrollController controller = ScrollController();
ScrollConfiguration(
behavior: MyCustomScrollBehavior(),
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
),
);
ScrollBehavior
既存のものをコピーして変更する移行前のコード:
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
移行後のコード:
// ScrollBehavior can be copied and adjusted.
final ScrollController controller = ScrollController();
ScrollConfiguration(
behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
),
);
タイムライン
リリースされたバージョン: 2.2.0-10.0.pre
安定版リリース: 2.2.0
参考文献
API ドキュメント:
ScrollConfiguration
ScrollBehavior
MaterialScrollBehavior
CupertinoScrollBehavior
Scrollbar
CupertinoScrollbar
関連する問題:
- 問題 #40107
- 問題 #70866
関連する PR:
- アプリ全体の設定の ScrollBehaviors を公開する
- 構成可能な ScrollBehaviors を使用してデスクトップ プラットフォームにスクロールバーを自動的に適用する